package io.operator;

/**
 * 计算机对有符号数（包括浮点数）的表示有三种方法：原码、反码和补码， 补码=反码+1。 在 二进制里，是用 0 和 1
 * 来表示正负的，最高位为符号位，最高位为 1 代表负数，最高位为 0 代表正数。
 * 
 * @author Administrator
 * 
 */
public class ShiftOperator {

	public static void main(String[] args) {
		leftMove();
		rightMove();
		unSignRightMove();
	}

	/**
	 * 左移位运算符（<<）能将运算符左边的运算对象向左移动运算符右侧指定的位数（在低位补 0）
	 * 
	 * 负数的情况:十进制如何转为二进制 1.先将-5的绝对值转换成二进制，即为0000 0101 2.然后求该二进制的反码，即为 1111 1010
	 * 3.最后将反码加1，即为：1111 1011
	 * Integer是32位(bit)的,所以结果是：11111111111111111111111111111011
	 */
	public static void leftMove() {
		System.out.println("左移运算符");
		int start_1 = 5;
		System.out.println(start_1 + ":" + Integer.toBinaryString(start_1));
		int end_1 = 5 << 2;
		System.out.println(end_1 + ":" + Integer.toBinaryString(end_1));

		int start_2 = -5;
		System.out.println(start_2 + ":" + Integer.toBinaryString(start_2));
		int end_2 = -5 << 2;
		System.out.println(end_2 + ":" + Integer.toBinaryString(end_2));
	}

	/**
	 * "有符号"右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数 若值为正，则在高位插入0；若值为负，则在高位插入1
	 */
	public static void rightMove() {
		System.out.println("(有符号)右移位运算符运算符");
		int start_1 = 5;
		System.out.println(start_1 + ":" + Integer.toBinaryString(start_1));
		int end_1 = 5 >> 2;
		System.out.println(end_1 + ":" + Integer.toBinaryString(end_1));

		int start_2 = -5;
		System.out.println(start_2 + ":" + Integer.toBinaryString(start_2));
		int end_2 = -5 >> 2;
		System.out.println(end_2 + ":" + Integer.toBinaryString(end_2));
	}

	/**
	 * 右移位运算符(>>>):零填充高位
	 */
	public static void unSignRightMove() {
		System.out.println("右移位运算符运算符");
		int start_1 = 5;
		System.out.println(start_1 + ":" + Integer.toBinaryString(start_1));
		int end_1 = 5 >>> 2;
		System.out.println(end_1 + ":" + Integer.toBinaryString(end_1));

		int start_2 = -5;
		System.out.println(start_2 + ":" + Integer.toBinaryString(start_2));
		int end_2 = -5 >>> 2;
		System.out.println(end_2 + ":" + Integer.toBinaryString(end_2));
	}
}
